package com.atguigu.utils;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;

import java.util.Arrays;

/**
 * @author 伟哥
 * @date 2021-05-01 19:58
 */

public class LogUtils {
    public static void logStart(JoinPoint joinPoint){
        System.out.println("（前置通知）【"+joinPoint.getSignature().getName()+"】方法开始执行，用的参数列表:"
                +Arrays.asList(joinPoint.getArgs()));
    }

    public static void logEnd(Object result) {
        System.out.println("（返回通知）方法正常执行完成，结果是："+result);
    }


    public static void logException(Exception exception) {
        System.out.println("（异常通知）方法出现的代理异常："+exception);
    }


    public static void logFinal(JoinPoint joinPoint) {
        System.out.println("（最终通知）【"+joinPoint.getSignature().getName()+"】方法最终结束了！");
    }


    public Object myAround(ProceedingJoinPoint pjp){

        // 获取方法参数
        Object[] args = pjp.getArgs();
        // 获取方法名
        String methodName = pjp.getSignature().getName();

        Object result = null;
        try {
            System.out.println("环绕前置通知：方法名："+pjp.getSignature().getName());
            //等价于 method.invoke(目标对象，参数列表)
            result = pjp.proceed(args);
            System.out.println("环绕返回通知：结果是："+result);
        } catch (Throwable throwable) {
            System.out.println("环绕异常通知：异常是："+throwable);
            //提示：为了让外界能感知这个异常，将此异常跑出去
            throw new RuntimeException(throwable);

        } finally {
            System.out.println("环绕最终通知：方法结束！");
        }

        //反射调用之后，产生的返回值
        return result;
    }
}
